/* 
 * File:   RepositorioPoller.h
 * Author: maximiliano
 *
 * Created on May 14, 2013, 6:05 PM
 */

#include <stdint.h>
#include <unistd.h>
#include "client_OperacionSincronizacionRepositorio.h"
#include "client_OperacionSincronizacionInicialRepositorio.h"
#include "common_Thread.h"
#include "common_FileUtils.h"
#include "common_Repositorio.h"
#include "common_Mutex.h"
#include "client_IRepositorioPollerManejadorEvento.h"


using namespace TP::Threading;
using namespace TP::Operaciones;

#ifndef REPOSITORIOPOLLER_H
#define	REPOSITORIOPOLLER_H

namespace TP { namespace Archivos {


class RepositorioPoller : public Thread {

public:
   
    RepositorioPoller(Repositorio* pRepositorio, uint32_t pIntervaloPoleo);
    
    void SetRepositorioPollerManejadorEvento (IRepositorioPollerManejadorEvento* pManejadorEventos);
    
    void SetOperacionSincronizacionInicialRepositorio (OperacionSincronizacionInicialRepositorio* pOperacionSincrnizacionInicialRepositorio);
    
    void SetOperacionSincronizacionRepositorio (OperacionSincronizacionRepositorio* pOperacionSincrnizacionRepositorio);
    
    virtual ~RepositorioPoller();

    virtual void Iniciar() throw (Excepcion&);

    virtual void Finalizar() throw (Excepcion&);

protected:
        
    virtual void tarea ();
    
private:
    
    void setPoleando(const bool pValor);
    
    bool getPoleando();
    
    void evaluarArchivo(const string& pNombreArchivo);
    
    bool esArchivoNuevo(const string &pNombreArchivo);
    
    bool esArchivoModificado(const string &pNombreArchivo);
    
    void notificarArchivoNuevo (const string &pNombreArchivo);
    
    void notificarArchivoModificado (const string &pNombreArchivo);
    
    void actualiarEstadoArchivosEliminados ();
    
    void ActualizarRepositorio();
    
    bool _poleando;
    Mutex _poleandoMutex;
    Repositorio* _repositorio;
    uint32_t _intervaloPoleo;
    IRepositorioPollerManejadorEvento* manejadorEvento;
    
    OperacionSincronizacionRepositorio *_operacionSincronizacionRepositorio;
    OperacionSincronizacionInicialRepositorio *_operacionSincronizacionInicialRepositorio;
    
    FileUtils _fileUtils;
};

}}

#endif	/* REPOSITORIOPOLLER_H */

